//
// Created by hsj on 2024-1-8.
//


#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

#ifdef WIN32
//windows minGW64
//inet_ntop函数：_WIN32_WINNT
#ifdef _WIN32_WINNT
#undef _WIN32_WINNT
#endif
#define _WIN32_WINNT 0x0600
#include <winsock2.h>
#include <ws2tcpip.h>
//#pragma comment(lib,"ws2_32.lib")
#else
//linux  gcc
#include <arpa/inet.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#endif
void error_handling(char *message);

int main(int argc, char *argv[]){
    int sock;
    int snd_buf=1024*3, rcv_buf=1024*3;
    int state;
    socklen_t len;
    sock=socket(PF_INET, SOCK_STREAM, 0);

    state=setsockopt(sock, SOL_SOCKET, SO_RCVBUF, (void*)&rcv_buf, sizeof(rcv_buf));
    if(state)
        error_handling("setsockopt() error!");
    state=setsockopt(sock, SOL_SOCKET, SO_SNDBUF, (void* )&snd_buf, sizeof(snd_buf));
    if(state)
        error_handling("setsockopt() error!");

    len=sizeof(snd_buf);
    state=getsockopt(sock, SOL_SOCKET, SO_SNDBUF, (void*)&snd_buf, &len);
    if(state)
        error_handling( "getsockopt() error!");

    len=sizeof(rcv_buf);
    state=getsockopt(sock, SOL_SOCKET, SO_RCVBUF, (void*)&rcv_buf, &len);
    if(state)
        error_handling(" getsockopt() error!");

    /**
     *  输出结果跟我们预想的完全不同，但也算合理。缓冲大小的设置需谨慎处理，因此不会完全
        按照我们的要求进行，只是通过调用setsockopt函数向系统传递我们的要求。如果把输出缓冲设
        置为0并如实反映这种设置，TCP协议将如何进行?如果要实现流控制和错误发生时的重传机制，
        至少要有一些缓冲空间吧?上述示例虽没有100%按照我们的请求设置缓冲大小，但也大致反映
        出了通过setsockopt函数设置的缓冲大小。
     */
    printf("Input buffer size: %d \n", rcv_buf);
    printf( "Output buffer size: %d \n", snd_buf);

//    SOCKET socket; ---->uint_ptr

    return EXIT_SUCCESS;
}

void error_handling(char *message){
    fputs (message, stderr);
    fputc('\n', stderr);
    exit(1);
}